// let const 块级作用域
// 全局作用域和函数作用域

// 0 1 2
// for (var i = 0; i < 3; i++) {
//   for (var i = 0; i < 3; i++) {
//     console.log(i);
//   }
// }

// let 会产生对应的块级作用，当每一次内层循环结束之后，块级作用域也就消失了。
// 0 1 2 | 0 1 2 | 0 1 2
for (var i = 0; i < 3; i++) {
  for (let i = 0; i < 3; i++) {
    console.log(i);
  }
}

// 当代码在预编译的时候，看见var会将age提前放入到栈里面，并且赋值为undefined
// 当代码执行到let的时候，产生块级作用域，只能在对应的块才能被访问
if (true) {
  // console.log(name);
  let name = 'cuvee';
  var age = 100;
  console.log(name);
}

// ----------------全局作用域绑定函数
const elements = [];
for (var j = 0; j < 3; j++) {
  elements[j] = function () {
    console.log(j);
  };
}

elements[0]();
elements[1]();
elements[2]();

// ------------使用闭包来解决
console.log('---------使用闭包');
for (var m = 0; m < 3; m++) {
  elements[m] = (function (m) {
    return function () {
      console.log(m);
    };
  })(m);
}

elements[0]();
elements[1]();
elements[2]();

// -----------使用块级作用域来解决
console.log('-----------块级作用域');
for (let n = 0; n < 3; n++) {
  elements[n] = function () {
    console.log(n);
  };
}

elements[0]();
elements[1]();
elements[2]();

// const跟let不一样的是，声明的变量，基本类型的值不能改变，引用类型的内存地址不能改变
